package jm.nj.demo09mian.demo02;

import javafx.scene.chart.ValueAxis;

import javax.xml.transform.Source;
import java.util.*;

/*
 * java.util.HashMap类 实现 Map
 *
 * HashMap的特点:类似HashSet
 *       1.底层是一个哈希表:数组+链表,查询块,增删快
 *       2.允许null键null值
 *       3.无序集合
 *       4.不同步,多线程
 *
 * 注意:自定义类型什么 时候重写hashCode和equals方法
 *       使用HashSet集合和HashMap(自定义为键时重写),保证相同名字和年龄的人视为重复的人
 *       使用List集合  不用hashCode和equals方法,因为list集合的add方法不会调用hashCode和equals方法,可以存储重复的元素
 * */
public class Demo01HashMap {
    public static void main(String[] args) {
        method_03();
    }
/*
* 使用List集合存储自定义类型
* */
    private static void method_03() {
        ArrayList<Person>list  = new ArrayList<Person>();
        list.add(new Person("女王",18));
        list.add(new Person("女王",18));
        System.out.println(list);
    }

    /*
* 使用HashMap存储自定义类型
* key:Person
* value:String
* 要求同名和年龄的人,视为同一个人
* 所以:Person中必须重写HashCode和equals方法,保证相同名字和年龄的人视为重复的人
*
* */
    private static void method_02() {
        HashMap<String,Person>map = new HashMap<String,Person>();
        map.put("中国",new Person("大大",60));
        map.put("美国",new Person("obama",50));
        map.put("英国",new Person("女王",18));
        map.put("俄罗斯",new Person("普京",65));
        map.put("美国",new Person("特朗普",10));
        //
        Set<Map.Entry<String,Person>>set = map.entrySet();

        Iterator<Map.Entry<String,Person>>it = set.iterator();
        while (it.hasNext()){
            Map.Entry<String,Person>entry = it.next();
            String key = entry.getKey();
            Person value = entry.getValue();
            System.out.println(value.getName()+":"+value.getAge()+":"+key);
        }
    }

    /*
     *  自定义类型作为HashMap中的Value,key使用字符串
     * 因为String类重写了hashCode和equals方法,所以保证了键不重复
     * */
    private static void method_01() {
        HashMap<String,Person>map = new HashMap<String, Person>();
        map.put("中国",new Person("大大",60));
        map.put("美国",new Person("obama",50));
        map.put("英国",new Person("女王",18));
        map.put("俄罗斯",new Person("普京",65));
        map.put("美国",new Person("特朗普",10));

        //遍历Map集合
        Set<String> set = map.keySet();
        for(String key :set){

            Person p = map.get(key);

            System.out.println(p);
            System.out.println(key+":"+p.getName()+":"+p.getAge());
        }

    }
}
